﻿using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using ImpExpData.Interface;
using Common;

namespace ImpExpData.Presenter
{
    class ImportPresenter
    {
        private IImportForm _view;
        private Thread thread;
        private delegate bool CheckDelegate();
        private delegate void GoMethod();

        private delegate void SetInteger(int i);
        private delegate void SetString(string str);
        
        
        private bool GetBoolParameter(CheckDelegate callback)
        {
            return (bool)((Control)_view).Invoke(callback);
        }

        public ImportPresenter(IImportForm view)
        {
            _view = view;
            _view.StartImportData += StartLoad;
            _view.AbortImportData += AbortLoad;
        }

        private void Loading()
        {
            string file;
            string path = Settings.GetInstance().ImportPath;
            List<ImportData> importData = new List<ImportData>();
            if (GetBoolParameter(() => _view.IsAllGoods))
            {
                ////Groups
                //ImportDataTable importTable = new ImportDataTable();
                //importTable.Name = "Групи товарів";
                //file = path + "/Groups.xml";
                //importTable.FileName = file;
                //importTable.TableName = "Groups";
                //if (!File.Exists(file))
                //{
                //    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                //                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                //    {
                //        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                //        return;
                //    }
                //}
                //else
                //{
                //    importData.Add(importTable);
                //}

                ////TradeMarks
                //importTable = new ImportDataTable();
                //importTable.Name = "Торгові марки";
                //file = path + "/Trademarks.xml";
                //importTable.FileName = file;
                //importTable.TableName = "Trademarks";
                //if (!File.Exists(file))
                //{
                //    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                //                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                //    {
                //        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                //        return;
                //    }
                //}
                //else
                //{
                //    importData.Add(importTable);
                //}
                

                //Goods
                ImportDataTableZero importGoods = new ImportDataTableZero();
                importGoods.Name = "Товари";
                importGoods.ColumnByZero = "Remaining";
                file = path + "/Goods.xml";
                importGoods.FileName = file;
                importGoods.TableName = "Goods";

                if (!File.Exists(file))
                {
                    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                    {
                        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                        return;
                    }
                }

                 else
                {
                    importData.Add(importGoods);
                }

            }
            else if (GetBoolParameter(() => _view.IsRemaining))
            {
                ImportColumnsZero importGoods = new ImportColumnsZero();
                importGoods.Columns = new string[] {"IdGood", "Remaining"};
                importGoods.Name = "Залишки товарів";
                importGoods.ColumnByZero = "Remaining";
                file = path + "/Remaining.xml";
                importGoods.FileName = file;
                importGoods.TableName = "Goods";
                if (!File.Exists(file))
                {
                    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                    {
                        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                        return;
                    }
                }
                else
                {
                    importData.Add(importGoods);
                }
            }

            if (GetBoolParameter(() => _view.IsBuyers))
            {
                //Buyers
                ImportDataTable importTable = new ImportDataTable();
                importTable.Name = "Список клыэнтів";
                file = path + "/Buyers.xml";
                importTable.FileName = file;
                importTable.TableName = "Buyers";

                if (!File.Exists(file))
                {
                    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                    {
                        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                        return;
                    }
                }
                else
                {
                    importData.Add(importTable);
                }

                //BuyPoint
                importTable = new ImportDataTable();
                importTable.Name = "Торгові точки";
                file = path + "/BuyPoints.xml";
                importTable.FileName = file;
                importTable.TableName = "BuyPoints";

                if (!File.Exists(file))
                {
                    if (MessageBox.Show(string.Format("Незнайдено Файлу {0} продовжувати ?", file), "Незнайдено файлу",
                                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                    {
                        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                        return;
                    }
                }
                else
                {
                    importData.Add(importTable);
                }
                
            }

            if (GetBoolParameter(() => _view.IsDebts))
            {
                //DEBTS
            }

            ((Control) _view).Invoke(new SetInteger(_view.SetStatusMax), importData.Count);
            ((Control)_view).Invoke(new SetInteger(_view.SetStatusPosition), 0);
            int status = 0;
            foreach (ImportData import in importData)
            {
                //try
                //{
                    ((Control) _view).Invoke(new SetString(_view.SetStatusLabel), import.Name);
                    import.LoadData();
                    status++;
                    ((Control) _view).Invoke(new SetInteger(_view.SetStatusPosition), status);
                //}
                //catch(Exception)
                //{
                //    if (MessageBox.Show(
                //        string.Format("Помилка при завантаженні {0} файлу {1} таблиці {2} продовжити ?", import.Name,
                //                      import.FileName, import.TableName), string.Empty, MessageBoxButtons.YesNo,
                //        MessageBoxIcon.Hand, MessageBoxDefaultButton.Button2) == DialogResult.No)
                //    {
                //        ((Control)_view).Invoke(new GoMethod(_view.ErrorData));
                //        return;
                //    }
                //}
            }
           // ((Control)_view).Invoke(new GoMethod(_view.EndData));
        }

        public void AbortLoad (object sender, EventArgs e)
        {
            thread.Abort();
            _view.ErrorData();
        }

        public void StartLoad(object sender, EventArgs e)
        {
            Loading();
            //thread = new Thread(new ThreadStart(Loading));
            //thread.IsBackground = true;
            //thread.Start();
        }
    }
}
